package main

import (
	"bufio"
	"fmt"
	"io"
	"log"
	"os"
)

// 文件操作

/**
创建文件
*/
func createFile() {
	file, err := os.Create("test.txt")
	if err != nil {
		log.Println(err)
		return
	}
	log.Println("创建文件成功", file)
	file.Close()
}

/**
裁剪文件
*/
func truncateFile() {
	// 裁剪一个文件到100个字节。
	// 如果文件本来就少于100个字节，则文件中原始内容得以保留，剩余的字节以null字节填充。
	// 如果文件本来超过100个字节，则超过的字节会被抛弃。
	// 这样我们总是得到精确的100个字节的文件。
	// 传入0则会清空文件。
	err := os.Truncate("test.txt", 200)
	if err != nil {
		log.Println(err)
	}
	log.Println("裁剪文件成功")
}

/**
获取文件信息
*/
func fileMsg() {
	fileInfo, err := os.Stat("test.txt")
	if err != nil {
		log.Println(err)
		return
	}
	fmt.Println("File name:", fileInfo.Name())
	fmt.Println("Size in bytes:", fileInfo.Size())
	fmt.Println("Permissions:", fileInfo.Mode())
	fmt.Println("Last modified:", fileInfo.ModTime())
	fmt.Println("Is Directory: ", fileInfo.IsDir())
	fmt.Printf("System interface type: %T\n", fileInfo.Sys())
	fmt.Printf("System info: %+v\n\n", fileInfo.Sys())

}

/**
移动（重命名）
*/
func moveFile() {
	var srcPath string = "test.txt"
	var newPath string = "test.2txt"
	err := os.Rename(srcPath, newPath)
	if err != nil {
		log.Println(err)
		return
	}
	log.Println("移动文件成功")
}

/**
删除文件
*/
func removeFile() {
	err := os.Remove("test.2txt")
	if err != nil {
		log.Println(err)
		return
	}
	log.Println("删除文件成功")
}

/**
打开 关闭 文件
*/
func openFile() {
	file, err := os.Open("sorted.bat")
	if err != nil {
		log.Println(err)
		return
	}
	file.Close()
	// 下面的属性可以单独使用，也可以组合使用。
	// 组合使用时可以使用 OR 操作设置 OpenFile的第二个参数，例如：
	// os.O_CREATE|os.O_APPEND
	// 或者 os.O_CREATE|os.O_TRUNC|os.O_WRONLY

	// os.O_RDONLY // 只读
	// os.O_WRONLY // 只写
	// os.O_RDWR // 读写
	// os.O_APPEND // 往文件中添建（Append）
	// os.O_CREATE // 如果文件不存在则先创建
	// os.O_TRUNC // 文件打开时裁剪文件
	// os.O_EXCL // 和O_CREATE一起使用，文件不能存在
	// os.O_SYNC // 以同步I/O的方式打开
	file, err = os.OpenFile("sorted.bat", os.O_CREATE|os.O_APPEND, 0666)
	if err != nil {
		log.Fatal(err)
	}
	file.Close()

}

/**
复制文件
*/
func copyFile() {
	file, err := os.Open("/Users/denglibin/timg.jpg")
	if err != nil {
		fmt.Println(err)
		return
	}
	file2, err2 := os.Create("/Users/denglibin/timg2.jpg")
	if err2 != nil {
		fmt.Println(err2)
		return
	}
	defer file.Close()
	defer file2.Close()
	bufr := bufio.NewReader(file)
	bufw := bufio.NewWriter(file2)
	buf := make([]byte, 1024)
	var n int = 0
	var readErr error = nil
	for {
		n, readErr = bufr.Read(buf)
		if readErr != nil {
			if readErr == io.EOF {
				fmt.Println("复制完成")
				break
			}
			fmt.Println(readErr)
			break
		}
		_, err := bufw.Write(buf[:n])
		if err != nil {
			log.Fatal(err)
		}
	}
	err = bufw.Flush()
	if err != nil {
		log.Fatal(err)
	}
}

//创建文件夹，已存在的不会影响
func createDir() {
	err := os.MkdirAll("C:\\Users\\mdjro\\Desktop\\tset1243", os.ModePerm)
	if err != nil {
		panic(err)
	}
}
func main37() {
	//createFile()
	//truncateFile()
	//fileMsg()
	//moveFile()
	//removeFile()
	//openFile()
	//copyFile()
	createDir()
}
